import type { ShallowRef } from 'vue'

/**
 * FPS 计算选项
 */
export interface UseFpsOptions {
  /**
   *每 x 帧计算一次 FPS
   * @default 10
   */
  every?: number
}

/**
 * 计算并返回当前 FPS（每秒帧数）
 * @param options - FPS 计算配置项
 * @returns 包含当前 FPS 值的响应式引用
 */
export default (options?: UseFpsOptions): ShallowRef<number> => {
  const fps = shallowRef(0)
  // 浏览器不支持 performance API 时直接返回 0
  if (typeof performance === 'undefined') return fps
  // 默认每10帧计算一次
  const every = options?.every ?? 10
  // 上一次计算的时间戳
  let last = performance.now()
  // 帧计数器
  let ticks = 0

  // 使用 requestAnimationFrame 循环计算
  useRafFn(() => {
    ticks += 1
    if (ticks !== every) return
    // 达到指定帧数时计算 FPS
    const now = performance.now()
    const diff = now - last
    // 计算 FPS 并四舍五入
    fps.value = Math.round(1000 / (diff / ticks))
    // 重置计数器和时间戳
    last = now
    ticks = 0
  })

  return fps
}
